#include "exit.h"
#include "led.h"

/**
* @brief 外部中断服务函数
* @param arg：中断引脚号
* @note IRAM_ATTR: 这里的 IRAM_ATTR 属性用于将中断处理函数存储在内部 RAM 中，
目的在于减少延迟
* @retval 无
*/
static void IRAM_ATTR exit_gpio_isr_handler(void *arg)
{
    uint32_t gpio_num = (uint32_t)arg;

    if (gpio_num == BOOT_INT_GPIO_PIN)
    {
        // 这里使用vTaskDelay()函数将导致系统重启
        // 断上下文（ISR）中禁止调用任何可能触发调度的函数：vTaskDelay、xQueueSend、xSemaphoreGive 等
        esp_rom_delay_us(20000);
        if( BOOT_INT == BOOT_INT_PRES )
        {
            LED_TOGGLE();
        }
    }
}
/**
 * @brief       外部中断初始化程序
 * @param       无
 * @retval      无
 */
void exit_init()
{
    gpio_config_t exit_init_struct;
    exit_init_struct.pin_bit_mask = 1ULL << BOOT_INT_GPIO_PIN;
    exit_init_struct.mode = GPIO_MODE_INPUT;
    exit_init_struct.intr_type = GPIO_INTR_NEGEDGE;
    exit_init_struct.pull_up_en = GPIO_PULLUP_ENABLE;
    exit_init_struct.pull_down_en = GPIO_PULLDOWN_DISABLE;
    gpio_config(&exit_init_struct);

    gpio_install_isr_service(ESP_INTR_FLAG_EDGE);

    gpio_isr_handler_add(BOOT_INT_GPIO_PIN,exit_gpio_isr_handler,
        (void*)BOOT_INT_GPIO_PIN);

    gpio_intr_enable(BOOT_INT_GPIO_PIN);
}